package com.yft.entity.base;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.math.NumberUtils;

import com.yft.dao.base.BaseConstant;

/**
 * 基础工具类
 * @author SalayXu
 */
public class BaseEntityUtils {
	
	/**
	 * Date转String
	 * @param date 待转日期
	 * @param formatStr 格式化标准，如不传 默认为 "yyyy-MM-dd HH:mm:ss"
	 * @return 如返回null请做相应处理
	 */
	public static String makeDateStr(Date date,String formatStr){
		if(formatStr==null || formatStr.length()==0)
			formatStr = "yyyy-MM-dd HH:mm:ss";
		String dateStr = null;
		try {
			dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
		} catch (Exception e) {
			dateStr = null;
		}
		return dateStr;
	}
	
	/**
	 * String转Date
	 * @param str 待转字符
	 * @param formatStr 格式化标准，如不传 默认为 "yyyy-MM-dd HH:mm:ss"
	 * @return 如返回null请做相应处理
	 */
	public static Date makeStrDate(String str,String formatStr){
		
		Date date = null;
		try {
			date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str);
		} catch (Exception e) {
			date = null;
		}
		return date;
	}
	
	/**
	 * 拼接待更新的内容
	 * @param obj 待更新的实体
	 * @param str 自定义的更新内容，没有则填null
	 * @return 拼接好的字符串
	 */
	public static String makeValues(Object obj,String str,String whereStr){
		String primaryKey = null;
		StringBuffer hql = new StringBuffer();
		hql.append("update "+obj.getClass().getSimpleName()+" c set c.updateTime=current_timestamp()");
		//整理当前类及其父类的所有字段
		Class<?> tempClass = obj.getClass();
		//是否有字段进行更新
		boolean hasModify = false;
		//除自身外，默认再搜索4级父类。
		final int searchLevel = 5; 
		for (int i = 0; i<searchLevel; i++) {
			if(i>0) tempClass = tempClass.getSuperclass();
			//无父类返回
			if(tempClass == null) break;
			Field [] field = tempClass.getDeclaredFields();
			if(field!=null && field.length>0){
				for(Field f : field){
					boolean isPk = false;
					//查找主键
					if(primaryKey==null){
						Annotation[] annotations = f.getAnnotations();
						for (Annotation anno : annotations) {
							if (anno.toString().contains("@javax.persistence.Id()")){
								primaryKey = f.getName();
								isPk = true;
								break;
							}
						}
					}
					//过滤不处理的字段包括主键字段
					if(isPk || f.getName()==null
							|| f.getName().equals("serialVersionUID")
							|| f.getName().startsWith(BaseConstant.ENTITY_SE)
							|| f.getName().startsWith(BaseConstant.ENTITY_SEB)
							|| f.getName().startsWith(BaseConstant.ENTITY_SEE)
							|| f.getName().startsWith(BaseConstant.ENTITY_SEC)
							|| f.getName().startsWith(BaseConstant.ENTITY_SEI)
							|| f.getName().startsWith(BaseConstant.ENTITY_SEO)
					) continue;
					f.setAccessible(true);
					Type t = f.getGenericType();
					//过滤字段类型
					try {
						if(checkFieldType(t,f.get(obj))){
							if(f.get(obj)!=null){
								hql.append(",c."+f.getName()+"=:"+f.getName());
								hasModify = true;
							}
						}
					} catch (IllegalArgumentException e) {
						//e.printStackTrace();
						return null;
					} catch (IllegalAccessException e) {
						//e.printStackTrace();
						return null;
					}
				}
			}
			//如果循环到BaseEntity则跳出
			if("BaseEntity".equals(tempClass.getSimpleName())) i = searchLevel;
		}
		//无更新返回
		if(!hasModify) return null;
		if(primaryKey==null || primaryKey.length()==0) return null;
		if(str!=null && str.length()>0) hql.append(str);
		if(whereStr!=null && whereStr.length()>0)
			hql.append(" "+whereStr);
		else
			hql.append(" where c."+primaryKey+"=:"+primaryKey);
		return hql.toString();
		
	}

	/**
	 * 拼接搜索条件值
	 * @param obj 待搜索的实体
	 * @return 拼接好的字符串
	 */
	public static String makeBaseCondition(Object obj){
		if(obj==null) return "";
		StringBuffer q = new StringBuffer();
		//整理当前类及其父类的所有字段
		Class<?> tempClass = obj.getClass();
		//除自身外，默认再搜索4级父类。
		final int searchLevel = 5; 
		for (int i = 0; i<searchLevel; i++) {
			if(i>0) tempClass = tempClass.getSuperclass();
			//无父类返回
			if(tempClass == null) break;
			Field [] field = tempClass.getDeclaredFields();
			if(field!=null && field.length>0){
				for(Field f : field){
					//过滤不处理的字段
					if(f.getName()==null
							|| f.getName().equals("serialVersionUID")
							|| f.getName().startsWith(BaseConstant.ENTITY_SEC)
					) continue;
//					System.out.println(f.getName());
					f.setAccessible(true);
					Type t = f.getGenericType();
					//过滤字段类型
					try {
						if(checkFieldType(t,f.get(obj)) || f.get(obj) instanceof List){
							if(f.get(obj)!=null){
								if(f.getName().startsWith(BaseConstant.ENTITY_SEB)){
									if(!t.equals(String.class) && !(f.get(obj) instanceof Enum))
										q.append(" and c."+f.getName().replaceFirst(BaseConstant.ENTITY_SEB, "")+">=:"+f.getName());
								}else if(f.getName().startsWith(BaseConstant.ENTITY_SEE)){
									if(!t.equals(String.class) && !(f.get(obj) instanceof Enum))
										q.append(" and c."+f.getName().replaceFirst(BaseConstant.ENTITY_SEE, "")+"<=:"+f.getName());
								}else if(f.getName().startsWith(BaseConstant.ENTITY_SEI)
										|| f.getName().startsWith(BaseConstant.ENTITY_SEO)){
									if(f.get(obj) instanceof List){
										List<?> list = (List<?>)f.get(obj);
										if(list.size()==0) continue;
										//过滤4种类型外的其他类型
										String str;
										if(list.get(0) instanceof String || list.get(0) instanceof Enum){
											str = "'";
										}else if(list.get(0) instanceof Integer || list.get(0) instanceof Long){
											str = "";
										}else continue;
										System.out.println(f.getName());
										//这里只支持INT类型，是不对的，以后再说，不要用先。
										if(f.getName().startsWith(BaseConstant.ENTITY_SEI))
											q.append(" and c."+f.getName().replaceFirst(BaseConstant.ENTITY_SEI, "")+" in (");
										else
											q.append(" and c."+f.getName().replaceFirst(BaseConstant.ENTITY_SEO, "")+" not in (");
										for (int j = 0; j < list.size(); j++) {
											if(j>0) q.append(",");
											q.append(str+list.get(j)+str);
										}
										q.append(")");
									}
								}else if(f.getName().startsWith(BaseConstant.ENTITY_SE)){
									q.append(" and c."+f.getName().replaceFirst(BaseConstant.ENTITY_SE, "")+" like:"+f.getName());
								}else{
									q.append(" and c."+f.getName()+"=:"+f.getName());
								}
							}
						}
					} catch (IllegalArgumentException e) {
						// TODO Auto-generated catch block
						//e.printStackTrace();
						return null;
					} catch (IllegalAccessException e) {
						// TODO Auto-generated catch block
						//e.printStackTrace();
						return null;
					}
				}
			}
			//如果循环到BaseEntity则跳出
			if("BaseEntity".equals(tempClass.getSimpleName())) i = searchLevel;
		}
		return q.toString();
	}
	
	/**
	 * 验证Integer类型的主键字符串
	 * @param ids 以,分隔的，Integer类型的主键字符串
	 * @return 合格与否
	 */
	public static boolean checkIntIds(String ids){
		String [] id = ids.split(",");
		boolean f = true;
		for(String i : id){
			if(i==null || NumberUtils.toInt(i.trim())<=0){
				f = false;
				break;
			}
		}
		return f;
	}
	
	private static boolean checkFieldType(Type t,Object obj){
		if(t.equals(String.class)
			||	t.equals(Integer.class)
			||	t.equals(Long.class)
			||	t.equals(Float.class)
			||	t.equals(Double.class)
			||	t.equals(Date.class)
			|| obj instanceof Enum)
		return true;
		return false;
	}
}
